
/**
 * Content: wait()-notify()用法 [必须配合 synchronized 使用]
 * --------------------------------------------------
 * Java线程基础(13):wait()和notify(): https://blog.csdn.net/mingyuli/article/details/118951549
 */

public class java_1110_wait_notify {

    // 必须使用 Object 对象来调用 wait() 和 notify() 方法  // 且必须配合 synchronized 来使用
    public static Object object = new Object();

    // 主线程
    public static void main(String[] args) {

        // wait()-notify()用法
        System.out.println("--------------------wait()-notify()用法--------------------");
        // 注: wait() 和 notify() 必须配合 synchronized 使用

        Thread0 thread0 = new Thread0(object);
        Thread1 thread1 = new Thread1(object);

        // thread0 里面调用 object.wait() 方法
        thread0.start();

        try {
            // 保证线程Thread0中的wait()方法优先执行，再执线程Thread1的notify()方法
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // thread0 里面调用 object.notify() 方法
        thread1.start();

    }
}

// Thread0线程，执行wait()方法
class Thread0 extends Thread {

    private Object object;

    public Thread0(Object object) {
        this.object = object;
    }

    @Override
    public void run() {
        synchronized (object) {
            System.out.println(Thread.currentThread().getName() + "初次获得对象锁，执行中，调用共享对象的wait()方法...");
            try {
                // 共享对象wait方法，会让线程释放锁。
                object.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "再次获得对象锁，执行结束");
        }
    }

}

// Thread1线程，执行notify()方法
class Thread1 extends Thread {

    private Object object;

    public Thread1(Object object) {
        this.object = object;
    }

    @Override
    public void run() {
        synchronized (object) {
            // 线程共享对象，通过 notify() 方法，释放锁并通知其他线程可以得到锁
            object.notify();
            System.out.println(Thread.currentThread().getName() + "获得对象锁，执行中，调用了共享对象的notify()方法");
        }
    }
}
